/**
 *
 * Utilities
 * Author: Stefan Petre www.eyecon.ro
 *
 */
(function($) {
EYE.extend({
    getPosition : function(e, forceIt)
    {
        var x = 0;
        var y = 0;
        var es = e.style;
        var restoreStyles = false;
        if (forceIt && jQuery.curCSS(e,'display') == 'none') {
            var oldVisibility = es.visibility;
            var oldPosition = es.position;
            restoreStyles = true;
            es.visibility = 'hidden';
            es.display = 'block';
            es.position = 'absolute';
        }
        var el = e;
        if (el.getBoundingClientRect) { // IE
            var box = el.getBoundingClientRect();
            x = box.left + Math.max(document.documentElement.scrollLeft, document.body.scrollLeft) - 2;
            y = box.top + Math.max(document.documentElement.scrollTop, document.body.scrollTop) - 2;
        } else {
            x = el.offsetLeft;
            y = el.offsetTop;
            el = el.offsetParent;
            if (e != el) {
                while (el) {
                    x += el.offsetLeft;
                    y += el.offsetTop;
                    el = el.offsetParent;
                }
            }
            if (jQuery.browser.safari && jQuery.curCSS(e, 'position') == 'absolute' ) {
                x -= document.body.offsetLeft;
                y -= document.body.offsetTop;
            }
            el = e.parentNode;
            while (el && el.tagName.toUpperCase() != 'BODY' && el.tagName.toUpperCase() != 'HTML')
            {
                if (jQuery.curCSS(el, 'display') != 'inline') {
                    x -= el.scrollLeft;
                    y -= el.scrollTop;
                }
                el = el.parentNode;
            }
        }
        if (restoreStyles == true) {
            es.display = 'none';
            es.position = oldPosition;
            es.visibility = oldVisibility;
        }
        return {x:x, y:y};
    },
    getSize : function(e)
    {
        var w = parseInt(jQuery.curCSS(e,'width'), 10);
        var h = parseInt(jQuery.curCSS(e,'height'), 10);
        var wb = 0;
        var hb = 0;
        if (jQuery.curCSS(e, 'display') != 'none') {
            wb = e.offsetWidth;
            hb = e.offsetHeight;
        } else {
            var es = e.style;
            var oldVisibility = es.visibility;
            var oldPosition = es.position;
            es.visibility = 'hidden';
            es.display = 'block';
            es.position = 'absolute';
            wb = e.offsetWidth;
            hb = e.offsetHeight;
            es.display = 'none';
            es.position = oldPosition;
            es.visibility = oldVisibility;
        }
        return {w:w, h:h, wb:wb, hb:hb};
    },
    getClient : function(e)
    {
        var h, w;
        if (e) {
            w = e.clientWidth;
            h = e.clientHeight;
        } else {
            var de = document.documentElement;
            w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;
            h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight;
        }
        return {w:w,h:h};
    },
    getScroll : function (e)
    {
        var t=0, l=0, w=0, h=0, iw=0, ih=0;
        if (e && e.nodeName.toLowerCase() != 'body') {
            t = e.scrollTop;
            l = e.scrollLeft;
            w = e.scrollWidth;
            h = e.scrollHeight;
        } else  {
            if (document.documentElement) {
                t = document.documentElement.scrollTop;
                l = document.documentElement.scrollLeft;
                w = document.documentElement.scrollWidth;
                h = document.documentElement.scrollHeight;
            } else if (document.body) {
                t = document.body.scrollTop;
                l = document.body.scrollLeft;
                w = document.body.scrollWidth;
                h = document.body.scrollHeight;
            }
            if (typeof pageYOffset != 'undefined') {
                t = pageYOffset;
                l = pageXOffset;
            }
            iw = self.innerWidth||document.documentElement.clientWidth||document.body.clientWidth||0;
            ih = self.innerHeight||document.documentElement.clientHeight||document.body.clientHeight||0;
        }
        return { t: t, l: l, w: w, h: h, iw: iw, ih: ih };
    },
    getMargins : function(e, toInteger)
    {
        var t = jQuery.curCSS(e,'marginTop') || '';
        var r = jQuery.curCSS(e,'marginRight') || '';
        var b = jQuery.curCSS(e,'marginBottom') || '';
        var l = jQuery.curCSS(e,'marginLeft') || '';
        if (toInteger)
            return {
                t: parseInt(t, 10)||0,
                r: parseInt(r, 10)||0,
                b: parseInt(b, 10)||0,
                l: parseInt(l, 10)
            };
        else
            return {t: t, r: r,    b: b, l: l};
    },
    getPadding : function(e, toInteger)
    {
        var t = jQuery.curCSS(e,'paddingTop') || '';
        var r = jQuery.curCSS(e,'paddingRight') || '';
        var b = jQuery.curCSS(e,'paddingBottom') || '';
        var l = jQuery.curCSS(e,'paddingLeft') || '';
        if (toInteger)
            return {
                t: parseInt(t, 10)||0,
                r: parseInt(r, 10)||0,
                b: parseInt(b, 10)||0,
                l: parseInt(l, 10)
            };
        else
            return {t: t, r: r,    b: b, l: l};
    },
    getBorder : function(e, toInteger)
    {
        var t = jQuery.curCSS(e,'borderTopWidth') || '';
        var r = jQuery.curCSS(e,'borderRightWidth') || '';
        var b = jQuery.curCSS(e,'borderBottomWidth') || '';
        var l = jQuery.curCSS(e,'borderLeftWidth') || '';
        if (toInteger)
            return {
                t: parseInt(t, 10)||0,
                r: parseInt(r, 10)||0,
                b: parseInt(b, 10)||0,
                l: parseInt(l, 10)||0
            };
        else
            return {t: t, r: r,    b: b, l: l};
    },
    traverseDOM : function(nodeEl, func)
    {
        func(nodeEl);
        nodeEl = nodeEl.firstChild;
        while(nodeEl){
            EYE.traverseDOM(nodeEl, func);
            nodeEl = nodeEl.nextSibling;
        }
    },
    getInnerWidth :  function(el, scroll) {
        var offsetW = el.offsetWidth;
        return scroll ? Math.max(el.scrollWidth,offsetW) - offsetW + el.clientWidth:el.clientWidth;
    },
    getInnerHeight : function(el, scroll) {
        var offsetH = el.offsetHeight;
        return scroll ? Math.max(el.scrollHeight,offsetH) - offsetH + el.clientHeight:el.clientHeight;
    },
    getExtraWidth : function(el) {
        if($.boxModel)
            return (parseInt($.curCSS(el, 'paddingLeft'))||0)
                + (parseInt($.curCSS(el, 'paddingRight'))||0)
                + (parseInt($.curCSS(el, 'borderLeftWidth'))||0)
                + (parseInt($.curCSS(el, 'borderRightWidth'))||0);
        return 0;
    },
    getExtraHeight : function(el) {
        if($.boxModel)
            return (parseInt($.curCSS(el, 'paddingTop'))||0)
                + (parseInt($.curCSS(el, 'paddingBottom'))||0)
                + (parseInt($.curCSS(el, 'borderTopWidth'))||0)
                + (parseInt($.curCSS(el, 'borderBottomWidth'))||0);
        return 0;
    },
    isChildOf: function(parentEl, el, container) {
        if (parentEl == el) {
            return true;
        }
        if (!el || !el.nodeType || el.nodeType != 1) {
            return false;
        }
        if (parentEl.contains && !$.browser.safari) {
            return parentEl.contains(el);
        }
        if ( parentEl.compareDocumentPosition ) {
            return !!(parentEl.compareDocumentPosition(el) & 16);
        }
        var prEl = el.parentNode;
        while(prEl && prEl != container) {
            if (prEl == parentEl)
                return true;
            prEl = prEl.parentNode;
        }
        return false;
    },
    centerEl : function(el, axis)
    {
        var clientScroll = EYE.getScroll();
        var size = EYE.getSize(el);
        if (!axis || axis == 'vertically')
            $(el).css(
                {
                    top: clientScroll.t + ((Math.min(clientScroll.h,clientScroll.ih) - size.hb)/2) + 'px'
                }
            );
        if (!axis || axis == 'horizontally')
            $(el).css(
                {
                    left: clientScroll.l + ((Math.min(clientScroll.w,clientScroll.iw) - size.wb)/2) + 'px'
                }
            );
    }
});
if (!$.easing.easeout) {
    $.easing.easeout = function(p, n, firstNum, delta, duration) {
        return -delta * ((n=n/duration-1)*n*n*n - 1) + firstNum;
    };
}

})(jQuery);